<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>promise对象</title>
</head>
<body>
    
    Promise初体验
    <!-- 
        Promise 是ES6异步编程的一种解决方案,解决回调地狱问题。
        许诺器，本质是构造函数，学名叫class 可以 new 
        Promise内部通常放的是将来要执行的异步代码，而这些异步代码执行完成后会有两种结果：成功或失败。
        因此Promise有三种状态：原理
​	     pending(初始状态 运行中) 、fullfill/resolve(成功状态)、rejecte(失败状态)。

        当在Promise内部执行了resolve()成功时的回调方法则执行定义在then()中的成功时的回调函数，
        并将Promise的pending初始状态转换fullfill/resolve成功状态；

        当在Promise内部执行了resolve()成功时的回调方法则执行定义在then()中
        第二个参数的失败时的回调函数或定义在catch()中失败时的回调函数，
        并将Promise的pending初始状态转换reject失败状态。 
     -->
    

    <script>
        // 回调地狱  层次  树形
        // setTimeout(() => {
        //     console.log('第一个请求完毕，cate')
        //     setTimeout(() => {
        //         console.log('第二个请求完毕，list')
        //         setTimeout(() => {
        //             console.log('第三个请求完毕，desc')
        //             setTimeout(() => {
        //                 console.log('第四个请求完毕，asc')  


        //             }, 1000)
        //         }, 1000)
        //     }, 1000)
        // }, 1000)

        // 链式调用
        
        // 1.基本使用语法
        // 1.1创建好实例但是没有执行任务，此刻状态是pending

        // let p = new Promise(()=>{ })

        // console.log('创建的promsie对象实例：', p)  //{<pending>}

        // 1.2在创建实例的时候需要给promise传递一个回调函数作为参数，
        // 在生成实例的过程中，promise构造函数会将处理成功和失败的两个函数回传给resolve和reject
        // let p2 = new Promise((resolve,reject)=>{
        //     console.log("成功函数",resolve);
        //     console.log("失败函数",reject);
           
            
        // })

        // console.log('创建的promsie对象实例：', p2) 

        //1.3注意promsie内部可以放待执行的异步代码，但是内部环境（ { } ）本质是同步的
            // console.log(1);//同步
            // let p = new Promise((resolve,reject)=>{

            //     setTimeout(() => {
            //         console.log(3);//异步
                    
            //     }, 0);

            //     console.log(2);//同步
                
            // })

            // console.log('创建的promsie对象实例：', p)//同步
            
            // 1.4通过resolve和reject修改promise状态（成功|失败）
            let p4 = new Promise((resolve, reject) => {
                // 定时器是异步代码
                setTimeout(() => {
                    // 时间到达需要调用resolve或者是reject修改promsie状态
                    if (true) {
                        resolve([1, 2, 3, 4])
                    } else {
                        reject('失败')
                    }
                }, 2000)
            })
            console.log('创建的promsie对象实例：', p4)//state:fulfilled result:成功了

             // 1.5通过resolve和reject修改promise状态（成功|失败）
            let p5 = new Promise((resolve, reject) => {
                // 定时器是异步代码
                setTimeout(() => {
                    // 时间到达需要调用resolve或者是reject修改promsie状态
                    if (false) {
                        resolve([1, 2, 3, 4])
                    } else {
                        reject('失败')
                    }
                }, 2000)
            })
            console.log('创建的promsie对象实例：', p5)//state:rejected result:失败了





    </script>

</body>
</html>